/**
 * 设计模式 发布-订阅和观察者模式
 */

//发布订阅:订阅方和发布方没有任何的关系，多个类解耦 存在中间调度

let e = {
    _callbacks: [],
    _obj:{},
    on(cb){
       this._callbacks.push(cb);
    },
    emit(key,value){
        this._obj[key] = value;
        this._callbacks.forEach(fn=>{
            fn(this._obj)
        })
    }
}

e.on(function(obj){
    console.log('获取第一个')
})

e.on(function(obj){
    if(Object.keys(obj).length  === 2){
        console.log(obj)
    }
})
fs.readFile('age.txt','utf8',function(error,data){
   e.emit('age',data);
})
fs.readFile('name.txt','utf8',function(error,data){
    e.emit('name',data);
 })

 //观察者模式 观察者和被观察者是有关联的
 class Subject{ //被观察者
    constructor(name){
        this.name = name;
        this.state = '开心';
        this.observers = [];
    }
    attach(ob){
        this.observers.push(ob);
    }
    setState(state){
       this.state = state;
       this.observers.forEach(observer=>{
           observer.update(this);
       })
    }

 }
class Observer{ //观察者
    constructor(name){
        this.name = name;
    }
    update(s){
        console.log(this.name+':'+s.name+s.state);
    }
}

let baby = new Subject('宝宝');
let parent1 = new Observer('爸爸');
let parent2 = new Observer('妈妈');
baby.attach(parent1);
baby.attach(parent2);
baby.setState('不开心');
baby.setState('哈哈开心');

